/*
 * Адаптер, Adapter или Wrapper/Обёртка — структурный шаблон проектирования, 
 * предназначенный для организации использования функций объекта, 
 * недоступного для модификации, через специально созданный интерфейс.
 * 
 * Декоратор, Decorator — структурный шаблон проектирования, 
 * предназначенный для динамического подключения дополнительного поведения 
 * к объекту.
 */
package patterns;

import java.io.*;
import java.util.zip.GZIPOutputStream;

public class AdapterDecoratorTest {

//    public static void main(String[] args) throws IOException {
//        Writer writer = new OutputStreamWriter(
//                new GZIPOutputStream(
//                new BufferedOutputStream(
//                new FileOutputStream(
//                new File("d:/tmp/tmp.zip")), 1024)), "UTF8");
//        //
//        writer.write("Hello Adapter/Decorator!");
//        writer.flush();
//        writer.close();
//    }

    public static void main(String[] args) throws IOException {
        //
        File file = new File("d:/tmp/tmp.zip");
        OutputStream fileOS = new FileOutputStream(file); // FileOutputStream адаптирует файл к OutputStream
        OutputStream bufferedOS = new BufferedOutputStream(fileOS, 1024);//BufferedOutputStream декорирует OutputStream
        OutputStream gzipOS = new GZIPOutputStream(bufferedOS);
        Writer writer = new OutputStreamWriter(gzipOS, "UTF8"); //адаптирует OutputStream к Writer
        //
        writer.write("Hello Adapter/Decorator!");
        writer.flush();
        writer.close();
    }
}